/**
 * 一个工厂类
 *
 * 功能类似于其它语言的 map
 */
class Factory {
    /**
     * 内部容器
     * @private
     */
    constructor() {
        this.container = {};
    }

    /**
     * 添加一个元素
     *
     * @param name 元素名称
     * @param obj 元素
     * @returns 被替换的元素，如果不存在则返回 undefined
     */
    put(name, obj) {
        const value = this.container[name];
        this.container[name] = obj;
        return value;
    }

    /**
     * 移除一个元素
     *
     * @param name 元素名称
     * @returns 被移除的产品，如果不存在则返回 undefined
     */
    remove(name) {
        const value = this.container[name];
        delete this.container[name];
        return value;
    }

    /**
     * 获取一个元素
     *
     * @param name 元素名称
     * @returns 返回指定名称的元素，如果不存在则返回 undefined
     */
    get(name) {
        return this.container[name];
    }

    /**
     * 清除所有元素
     */
    clear() {
        Object.keys(this.container).forEach(key => delete this.container[key]);
    }
}

export default Factory;